% function fap2D
%  fap2D.m       main loop
%         25 March 1999
% run  fap2Di  to initalise
% Example of approximation of two 2-dimensional functions
% using backpropagation in a batch mode
%
% ---------------,
% Andrew P. Paplinski,      app@dgs.monash.edu.au
% Comp.Sci.& Soft.Eng., http://www.dgs.monash.edu.au/~app/
% Monash University, Clayton 3168, [Melbourne,] AUSTRALIA 

% **********************  main loop *********************
figure(2), clf reset, hold off
tic
 for c = 1:C

% The forward pass
% Hidden signals  (L by N) with appended bias signals
 H = ones(L-1, N)./(1+exp(-Wh*X));	
 Hp = H.*(1-H);       % Derivatives of hidden signals
 H = [H ; ones(1,N)] ;
 Y = tanh(Wy*H)  ;    % Output signals        (m by N)
Yp = 1 - Y.^2 ;	    % Derivatives of output signals
                                      
% The backward pass

 Ey = D - Y;		   	% The output errors      (m by N)
 JJ = (sum((Ey.*Ey)'))';  % The total error after one epoch
 J(:,c) = JJ ;            % the performance function  m by 1
 delY = Ey.*Yp;			% Output delta signal    (m by N)
 dWy = delY*H';			% Update of the output matrix
                        % dWy  is  m by L 
 Eh = Wy(:,1:L-1)'*delY; % The backpropagated hidden error
                         % Eh  is  L-1 by N 
 delH = Eh.*Hp ;         % Hidden delta signals  (L-1 by N)
 dWh = delH*X';			 % Update of the hidden matrix
 % dWh  is  L-1 by  p                       
 % The batch update of the weights:
 Wy = Wy+eta(1)*dWy ;  Wh = Wh+eta(2)*dWh ;

 D1(:)=Y(1,:)'; D2(:)=Y(2,:)';

 % Two 2-D aproximated functions are ploted side by side
 surfc([X1-2 X1+2], [X2 X2], [D1 D2]), grid on, ...
 title(['epoch: ', num2str(c), ', error: ', num2str(JJ'), ...
       ', eta: ', num2str(eta)]), drawnow
 end  % of the training
toc

figure(3)
clf reset
plot(J'), grid
title('The approximation error')
xlabel('number of training epochs')

% print -deps2 -f2 fap2Dy.eps
% print -deps2 -f3 fap2De.eps

